import store from '@/store'
import { getToken, setToken, removeToken } from '@/utils/auth'

class TokenManager {
  constructor() {
    this.refreshTimer = null
    this.isRefreshing = false
    this.refreshPromise = null
    // Token过期前5分钟开始刷新
    this.refreshBeforeExpire = 5 * 60 * 1000 // 5分钟
    // Token默认有效期（如果后端没有返回过期时间，使用默认值）
    this.defaultTokenExpire = 2 * 60 * 60 * 1000 // 2小时
  }

  /**
   * 启动token自动刷新机制
   */
  startAutoRefresh() {
    this.stopAutoRefresh() // 先停止之前的定时器
    
    const token = getToken()
    if (!token) {
      return
    }

    // 计算token过期时间
    const tokenExpireTime = this.getTokenExpireTime()
    if (!tokenExpireTime) {
      // 如果无法获取过期时间，使用默认刷新间隔
      this.scheduleRefresh(this.defaultTokenExpire - this.refreshBeforeExpire)
      return
    }

    const now = Date.now()
    const timeUntilRefresh = tokenExpireTime - now - this.refreshBeforeExpire

    if (timeUntilRefresh <= 0) {
      // Token即将过期或已过期，立即刷新
      this.refreshToken()
    } else {
      // 在过期前5分钟刷新
      this.scheduleRefresh(timeUntilRefresh)
    }
  }

  /**
   * 停止自动刷新
   */
  stopAutoRefresh() {
    if (this.refreshTimer) {
      clearTimeout(this.refreshTimer)
      this.refreshTimer = null
    }
  }

  /**
   * 安排刷新任务
   */
  scheduleRefresh(delay) {
    this.refreshTimer = setTimeout(() => {
      this.refreshToken()
    }, delay)
  }

  /**
   * 刷新token
   */
  async refreshToken() {
    if (this.isRefreshing) {
      // 如果正在刷新，返回现有的Promise
      return this.refreshPromise
    }

    this.isRefreshing = true
    
    try {
      this.refreshPromise = store.dispatch('user/refreshToken')
      await this.refreshPromise
      
      console.log('Token刷新成功')
      
      // 刷新成功后，重新启动自动刷新
      this.startAutoRefresh()
      
    } catch (error) {
      console.error('Token刷新失败:', error)
      
      // 刷新失败，可能token已完全失效，清除token并跳转登录
      this.handleRefreshFailure()
      
    } finally {
      this.isRefreshing = false
      this.refreshPromise = null
    }
  }

  /**
   * 处理刷新失败
   */
  handleRefreshFailure() {
    removeToken()
    store.dispatch('user/resetToken')
    
    // 如果当前不在登录页面，跳转到登录页面
    if (window.location.pathname !== '/login') {
      window.location.href = '/login'
    }
  }

  /**
   * 获取token过期时间
   * 这里需要根据实际的token格式来解析
   */
  getTokenExpireTime() {
    const token = getToken()
    if (!token) {
      return null
    }

    try {
      // 如果token是JWT格式，可以解析payload获取过期时间
      const parts = token.split('.')
      if (parts.length === 3) {
        const payload = JSON.parse(atob(parts[1]))
        if (payload.exp) {
          return payload.exp * 1000 // JWT的exp是秒，转换为毫秒
        }
      }
    } catch (error) {
      console.warn('无法解析token过期时间:', error)
    }

    // 如果无法解析，返回null，使用默认刷新间隔
    return null
  }

  /**
   * 检查token是否即将过期
   */
  isTokenExpiringSoon() {
    const expireTime = this.getTokenExpireTime()
    if (!expireTime) {
      return false
    }

    const now = Date.now()
    return (expireTime - now) <= this.refreshBeforeExpire
  }

  /**
   * 检查token是否有效
   */
  isTokenValid() {
    const token = getToken()
    if (!token) {
      return false
    }

    const expireTime = this.getTokenExpireTime()
    if (!expireTime) {
      // 如果无法获取过期时间，假设token有效
      return true
    }

    return Date.now() < expireTime
  }
}

// 创建单例实例
const tokenManager = new TokenManager()

export default tokenManager